package com.lsl.chain_pattern.example;


import com.lsl.chain_pattern.example.concretehandler.*;
import com.lsl.chain_pattern.example.handler.Approver;

/**
 * description:
 * 如果需要在系统增加一个新的具体处理者
 * 如增加一个经理(Manager)角色可以审批5万元至8万元（不包括8万元）的采购单
 * 需要编写一个新的具体处理者类Manager，
 * 作为抽象处理者类Approver的子类，实现在Approver类中定义的抽象处理方法，如果采购金额大于等于8万元，则将请求转发给下家
 *
 * @author: liushengli
 * data: 2022/12/1
 */
class Client {
    public static void main(String[] args) {
        Approver wjzhang, gyang, jguo, meeting;
        /**
         * 由于链的创建过程由客户端负责，因此增加新的具体处理者类对原有类库无任何影响，无须修改已有类的源代码，符合“开闭原则”。
         * 在客户端代码中，如果要将新的具体请求处理者应用在系统中，需要创建新的具体处理者对象，然后将该对象加入职责链中。
         * 如在客户端测试代码中增加 Manager类 如下代码：
         */
        Approver rhuang;
        rhuang = new Manager("黄蓉");
        wjzhang = new Director("张无忌");
        gyang = new VicePresident("杨过");
        jguo = new President("郭靖");
        meeting = new Congress("董事会");

        //创建职责链
        wjzhang.setSuccessor(rhuang);
        rhuang.setSuccessor(gyang);
        gyang.setSuccessor(jguo);
        jguo.setSuccessor(meeting);

        //创建采购单
        PurchaseRequest pr1 = new PurchaseRequest(45000, 10001, "购买倚天剑");
        wjzhang.processRequest(pr1);

        PurchaseRequest pr2 = new PurchaseRequest(60000, 10002, "购买《葵花宝典》");
        wjzhang.processRequest(pr2);

        PurchaseRequest pr3 = new PurchaseRequest(80000, 10003, "购买屠龙刀");
        wjzhang.processRequest(pr3);

        PurchaseRequest pr4 = new PurchaseRequest(160000, 10004, "购买《金刚经》");
        wjzhang.processRequest(pr4);

        PurchaseRequest pr5 = new PurchaseRequest(800000, 10005, "购买桃花岛");
        wjzhang.processRequest(pr5);
    }
}